'''1.使用中括号"[]"创建列表'''
list_1 = [1,2,3,'a','b','c']
list_2 = [] #空列表
print(list_1)
print(list_2)

'''2.使用list()函数创建列表'''
# list()函数接收一个可迭代类型的数据,返回一个列表
list_3 = list('python')
list_4 = list([1,'python'])
print(list_3)
print(list_4)

'''使用isinstance()函数可以判断目标是否为可迭代对象'''
from collections.abc import Iterable
print(isinstance(list_2,Iterable))

'''访问列表元素'''
# 以索引方式访问列表元素
# list[n]
# 正向索引从0开始,反向索引从-1开始,
print(list_3[3])
print(list_3[-3])

'''以切片方式访问列表元素'''
# list[m:n:step]
# 表示按步长step获取列表list中索引m~n对应的元素,step默认为1,m和n可以省略,默认从0开始到末尾结束
li_one = ['p','y','t','h','o','n']
print(li_one[2:4:1]) # 从索引2开始到索引4结束,步长1取元素
print(li_one[2:]) # 从索引2开始到结束的所有元素
print(li_one[:2]) # 从索引0到2的所有元素
print(li_one[::2]) # 从开始到结束,步长2取元素
print(li_one[::]) # 显示所有元素
print(li_one[:]) # 显示所有元素
print(li_one) # 显示所有元素
# print(li_one[])

'''在循环中访问列表元素'''
for i in li_one:
    print(i,end = ' ')
print('\n')

'''查询列表元素'''
# Python的成员运算符in和not in.
print('p' in li_one)
print('p' not in li_one)

'''添加列表元素'''
# append()在列表末尾添加新的元素
# extend()在列表末尾一次性添加另一个列表中的所有元素
# insert()按照索引将新元素插入列表指定位置
li_two = [1,2,3,4]
li_two.append(5)
print(li_two)
li_three = [3,4,5,6]
li_two.extend(li_three)
print(li_two)
li_three.insert(2,li_two)
print(li_three)

'''元素排序'''
# sort()方法用于按特定顺序对列表元素排序,不会创建新的列表
# sort(key = None,reverse = False)
# key用于指定排序规则,reverse用于指定排序方式,True表示降序排列,False(默认)表示升序排列
li_11 = [1,3,2,0]
li_12 = [5,3,4,2]
li_13 = ['a','ab','abc']
li_11.sort() # 升序排列
li_12.sort(reverse=True) # 降序排列
li_13.sort(key=len,reverse=True) # 按字符串长度降序排列
print(li_11)
print(li_12)
print(li_13)

# sorted()方法用于按升序排列列表元素,该方法的返回值是升序排列后的新列表,排序操作不会对原列表产生影响.
li_14 = [ 5,4,3,2,1]
li_14reverse = sorted(li_14)
print(li_14)
print(li_14reverse)

# reverse()方法用于逆置列表,即吧原来列表中的元素从右至左依次排列存放.不会创建新的列表
li_15 = list('python')
# li_16 = li_15.reverse()
li_16 = reversed(li_15)
print(li_15)
print(li_16)

'''删除列表元素'''
# del语句
# del语句用于删除列表中指定位置的元素
name = ['bany','jack','king']
del name[0] # 删除索引为0的元素
print(name)
del name  # 删除列表
# print(name) # NameError: name 'name' is not defined

# remove()方法
# remove()方法用于移除列表中的某个元素,若列表中有多个匹配的元素,只移除匹配到的第一个元素
li_17 = list('hello')
print(li_17)
li_17.remove('l')
print(li_17)

# pop()方法
# pop()方法用于移除列表中的某个元素,若未指定具体元素,则移除列表中的最后一个元素
li_18 = list('python')
li_18.pop() # 移除列表中最后一个元素
print(li_18)
li_18.pop(1)
print(li_18) # 移除列表中索引为1的元素

# clear()方法
# clear()方法用于清空列表
li_18.clear()
print(li_18) # 空列表,并不是列表不存在了,区别于del语句

'''列表推导式'''
# 列表推导式的基本格式:
# [exp for x in list]
# 以上格式由表达式exp和之后的for...in...语句组成,其中for...in...用于遍历列表:exp用于在每层循环总对列表中的元素进行运算.
ls = [1,2,3,4,5,6,7,8]
ls = [i**2 for i in ls] #遍历ls中每个元素,每个元素求平方
print(ls)

# 带有if语句的列表推导式
# 在基本列表推导式的for语句之后添加一个if语句,就组成了带有if语句的列表推导式
# [exp for x in list if cond]
#上面格式的功能是:遍历列表,若列表中元素x符合条件cond,按表达式exp对其进行运算后将其添加到新列表中
ls = [int(i**0.5) for i in ls if i > 4]  # 遍历ls中所有元素,取出符合条件>4的元素,然后开根号转换为整型
print(ls)

# 嵌套for循环语句的列表推导式
# 在基本列表推导式的for语句之后添加一个for语句,就实现了列表推导式的循环嵌套.
# [exp for x in list_1 for y in list_2]
# 以上格式中的for语句按从左至右的顺序分别是外层循环和内层循环.利用此格式可以根据2个列表快速生成一个新列表.
ls_one = [1,2,3]
ls_two = [3,4,5]
ls_three = [x + y for x in ls_one if x > 1 for y in ls_two if y > 3] # 嵌套for循环也可以加if语句
print(ls_three)

# 带有if语句和嵌套for循环语句的列表推导式

'''元组
元组的表现形式为一组包含在圆括号()中,由逗号分隔的元素,元组中的元素个数,类型不受限制.'''
# 1.使用圆括号()可以直接创建元组,参考使用[]创建列表.注意:若元组中只有一个元素,该元素之后的','不能省略
# 2.使用内置函数tuple()可以创建元组,与使用list()函数创建列表类似.注意:tuple([1,2,3]是利用列表创建元组(1,2,3))
# 3.与列表相同,可以通过索引和切片访问元组的元素,也支持在循环中遍历元组
# 4.需要注意的是,元组是不可变类型,元组中的元素不能修改,即它不支持添加元素,删除元素和排序操作

'''集合'''
'''集合类型与列表和元组的区别是:集合中的元素无序但必须唯一.'''
# 1,使用{}创建集合
s1 = {1}
s2 = {1,'b',(1,2)}
# 2,使用内置函数set()创建集合,若使用set()创建非空集合,需为该函数传入可迭代对象
# 使用{}不能创建空集合,(不包含元素的{}创建的是空字典)
s = set() # 创建空集合
s1 = set([1,2,3,3]) #以列表创建集合
s2 = set((1,2,3)) #以元组创建集合
s3 = set('python') #随机排序
s4 = set(i for i in range(5))
print(s1,s2,s3,s4)
'''集合常见操作'''
'''
add(x): 向集合中添加元素x,x已存在时不做处理
remove(x): 删除集合中的元素x,若x不存在则抛出KeyError异常
discard(x): 删除集合中的元素x,若x不存在不做处理
pop(x): 随机返回集合中的一个元素,同时删除该元素,若集合为空,抛出KeyError异常
clear(): 清空集合
copy(): 复制集合,返回值为集合
isdisjoint(T): 判断集合与集合T是否没有相同的元素,没有返回True,有则返回False
'''

'''集合推导式'''
'''与列表推导式相似,区别在于集合推导式外侧为大括号{}'''
'''列表推导式'''
# 列表推导式的基本格式:
# [exp for x in list]
# 以上格式由表达式exp和之后的for...in...语句组成,其中for...in...用于遍历列表:exp用于在每层循环总对列表中的元素进行运算.
ls = [1,2,3,4,5,6,7,8]
s = {i**2 for i in ls} #遍历ls中每个元素,每个元素求平方
print(s)

# 带有if语句的列表推导式
# 在基本列表推导式的for语句之后添加一个if语句,就组成了带有if语句的列表推导式
# [exp for x in list if cond]
#上面格式的功能是:遍历列表,若列表中元素x符合条件cond,按表达式exp对其进行运算后将其添加到新列表中
s = {int(i**0.5) for i in ls if i > 4}  # 遍历ls中所有元素,取出符合条件>4的元素,然后开根号转换为整型
print(s)

# 嵌套for循环语句的列表推导式
# 在基本列表推导式的for语句之后添加一个for语句,就实现了列表推导式的循环嵌套.
# [exp for x in list_1 for y in list_2]
# 以上格式中的for语句按从左至右的顺序分别是外层循环和内层循环.利用此格式可以根据2个列表快速生成一个新列表.
ls_one = [1,2,3]
ls_two = [3,4,5]
s_three = {x + y for x in ls_one if x > 1 for y in ls_two if y > 3} # 嵌套for循环也可以加if语句
print(s_three)

# 带有if语句和嵌套for循环语句的列表推导式

'''字典'''
'''以"键值对"的形式组织数据,利用键快速查找值,是典型的映射类型'''
# 创建字典
# 字典的表现形式为一组包含在大括号'{}'中的键值对,每个键值对为一个字典元素,每个元素通过逗号','分隔,每对键值通过':'分隔
# {键1:值1,键2:值2,....,键n:值n}
# 字典的值可以是任意类型,但键不能是列表或者字典类型,字典元素无序,键/值必须唯一

# 使用{}直接创建字典
d1 = {} # 创建空字典
d2 = {'A':'123','B':'135','C':'680'}
d3 = {'A':123,12:'python'}

# 使用dict()也可以创建字典
d4 = dict() # 创建空字典
d5 = dict({'A':'123','B':'135'}) # 创建非空字典

# 字典的访问
# 字典变量[键]
print(d2['A'])
print(d3[12])
# get()方法访问,若指定键不存在,则返回默认值(defult)
# d.get(key[,defult])
print(d2.get('A'))
print(d2.get('D')) # 返回None
# keys() 获取所有的键
# values() 获取所有的值
# items() 获取所有的元素
print(d2.keys())
print(d2.values())
print(d2.items())
#内置方法keys() values() items() 返回的都是可迭代对象,可以用for循环遍历
for i in d2.items():
    print(i)

'''字典元素的添加和修改'''
# 字典支持通过为指定的键赋值或使用update()方法添加和修改元素,update()方法直接修改字典,不返回新字典
# 字典变量[键] = 值
# 字典变量.update(键=值)
add_dic = {'name':'jack','age':18,'height':183}
add_dic['score'] = 100
print(add_dic)
add_dic.update(sex='男') # 键名不用添加''双引号
print(add_dic)
add_dic['name'] = 'joker'
print(add_dic)
add_dic.update(age=20)
print(add_dic)

'''字典元素的删除'''
'''Python支持通过pop() , popitem() 和 clear() 方法删除字典中的元素'''
# pop()方法
# 根据指定的键删除字典中的指定元素,若删除成功,该方法返回目标元素的值
per_info = {'001':'张三','002':'李四','003':'王五','004':'赵六'}
print(per_info.pop('001')) # 使用pop方法删除键值为'001'的元素,并返回001对应的值
print(per_info)
# popitem()方法
# 随机删除字典中的元素,若删除成功,popitem()返回被删除的元素
per_info = {'001':'张三','002':'李四','003':'王五','004':'赵六'}
print(per_info.popitem()) # 使用popitem()方法删除随机元素,并返回该元素
print(per_info)
# clear()方法
# 清空字典
per_info = {'001':'张三','002':'李四','003':'王五','004':'赵六'}
print(per_info.clear()) # 清空
print(per_info)

'''字典推导式'''
# 字典推导式的格式,用法与列表推导式类似,区别在于字典推导式外侧为大括号'{}',且内部需包含键和值两个部分
# {new_key:new_value for key,value in dict.items()}
old_dict = {'name':'jack','age':23,'height':185}
new_dict = {value:key+'类' for key,value in old_dict.items()}
print(new_dict)